package com.itheima.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @ClassName orderServiceImpl3
 * @Description TODO
 * @Date 2023/7/25 18:51
 * @Version 1.0
 */
@Service
@Slf4j
public class OrderServiceImpl3 {

    int i = 0;

    /*
        value: 定义一个资源
        定义当资源内部发生异常的时候的处理逻辑
        blockHandler:  定义当资源内部发生了 BlockException 应该进入的方法[捕获的是 Sentinel 定义的异常]
        fallback:      定义当资源内部发生了 Throwable 应该进入的方法
    */
    @SentinelResource(value = "message",
            blockHandlerClass = OrderServiceImpl3BlockHandler.class,
            blockHandler = "blockHandler",
            fallbackClass = OrderServiceImpl3Fallback.class,
            fallback = "fallback")
    public String message() {
//        i++;
//        if (i % 3 == 0) {
//            throw new RuntimeException();
//        }
        return "message";
    }

//    /*
//        blockHandler
//        要求:
//        (1) 返回值类型和参数类型必须与原方法一致，
//        (2) 但允许在参数列表的最后加入一个参数 BlockException，用来接收原方法中发生的异常
//    */
//    public String blockHandler(String name, BlockException e) {
//        //自定义异常处理逻辑
//        log.error("触发了 BlockException，内容是 {}", e);
//        return "BlockException";
//    }
//
//    /*
//        fallback
//        要求:
//        (1) 返回值类型和参数类型必须与原方法一致，
//        (2) 但允许在参数列表的最后加入一个参数 Throwable，用来接收原方法中发生的异常
//    */
//    public String fallback(String name, Throwable e) {
//        //自定义异常处理逻辑
//        log.error("触发了 BlockException，内容是 {}", e);
//        return "Throwable";
//    }

    
}
